class Solution091 {
    public int minCost(int[][] costs) {
      int n = costs.length ; 
      // 状态表示 : 第 i 号房子 选 j 个颜色时, 最小花费
      int[][] dp = new int[n][3] ;
      for(int i=0 ; i <3 ; i ++){
        dp[0][i] = costs[0][i] ;
      }
      // 状态转移方程: 第i个 第j个状态 , 从 第i-1个 ,另外两个颜色的 最小值 得到
      for(int i=1 ; i < n ; i ++){
          dp[i][0] = costs[i][0] + Math.min(dp[i-1][1] , dp[i-1][2]) ;
          dp[i][1] = costs[i][1] + Math.min(dp[i-1][0] , dp[i-1][2]) ; 
          dp[i][2] = costs[i][2] + Math.min(dp[i-1][0] , dp[i-1][1]) ;
      }
      
      return Math.min(dp[n-1][0] , Math.min(dp[n-1][1] , dp[n-1][2])) ; 
    }
}